<?php

namespace app\mode\aliyun;

use OSS\OssClient;
use OSS\Core\OssException;

/**
 * Class Common
 *
 * 示例程序【Samples/*.php】 的Common类，用于获取OssClient实例和其他公用方法
 */
class Oss
{
    public $client;
    private $bucket;    //资源名称(Bucket名称)

    public function __construct()
    {
        $this->getOssClient();
//        $this->bucket = getSettingOptionsCache('uploader.space_name');
        $this->bucket = config('common.aliyun.oss.OSS_TEST_BUCKET');
    }

    /**
     * 根据Config配置，得到一个OssClient实例
     *
     * @return void 一个OssClient实例
     */
    public function getOssClient()
    {
        try {
            if (!isset($this->client)) {
//                $this->client = new OssClient(getSettingOptionsCache('uploader.public_key'), getSettingOptionsCache('uploader.private_key'), getSettingOptionsCache('uploader.space_domain_name'), false);
                $this->client = new OssClient(config('common.aliyun.oss.OSS_ACCESS_ID'), config('common.aliyun.oss.OSS_ACCESS_KEY'), config('common.aliyun.oss.OSS_ENDPOINT'), false);
            }

        } catch (OssException $e) {
            printf(__FUNCTION__ . "creating OssClient instance: FAILED\n");
            printf($e->getMessage() . "\n");
        }

    }

    /**
     * 上传文件到oss并删除本地文件
     * @param string $path  文件路径
     * @param bool $del     是否删除本地文件
     * @return bool         是否上传
     */
    public function upload(string $path, bool $del = false): bool
    {
        #云上的文件默认是从云上的根路径开始的，因此需要去除./
        // 先统一去除左侧的.或者/ 再添加./
        $oss_path = ltrim($path, './');
        $path = './' . $oss_path;
        //需要使用到本地的源文件，因此需要判断文件是否存在
        if (file_exists($path)) {
            // 上传到oss
            $this->client->uploadFile($this->bucket, $oss_path, $path);
            // 如需上传到oss后 自动删除本地的文件 则删除下面的注释
            $del and unlink($path);
            return true;
        }
        return false;
    }

    /**
     * 删除oss上指定文件
     * @param string $object 文件路径 例如删除 /Public/README.md文件  传Public/OLD.md 即可
     */
    public function delete_object(string $object)
    {
        #云上的文件默认是从云上的根路径开始的，因此需要去除./
        $object = ltrim($object, './');
        return $this->client->deleteObject($this->bucket, $object);
    }


}